<!DOCTYPE html> <html lang=en-US class style><!--
 Page saved with SingleFile 
 url: https://doc.iocoder.cn/mall/trade-aftersale/ 
 saved date: Sat Apr 20 2024 14:17:20 GMT+0800 (中国标准时间)
--><meta charset=utf-8>
<title>【交易】售后退款 | ruoyi-vue-pro 开发指南</title>
<style>:root{--sf-img-13: url("")}</style><style>@keyframes linearBottom{0%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1;filter:alpha(opacity=100)}to{-webkit-transform:translate3d(0,80px,0);-moz-transform:translate3d(0,80px,0);-o-transform:translate3d(0,80px,0);transform:translate3d(0,80px,0);opacity:0;filter:alpha(opacity=0)}}@keyframes linearTop{0%{-webkit-transform:translate3d(0,80px,0);-moz-transform:translate3d(0,80px,0);-o-transform:translate3d(0,80px,0);transform:translate3d(0,80px,0);opacity:0;filter:alpha(opacity=0)}to{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1;filter:alpha(opacity=100)}}@keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);-moz-animation-timing-function:cubic-bezier(.215,.61,.355,1);-o-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;filter:alpha(opacity=0);-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:1;filter:alpha(opacity=100);-webkit-transform:scale3d(1,1,1);-moz-transform:scale3d(1,1,1);-o-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(1.2,1.2,1.2);-moz-transform:scale3d(1.2,1.2,1.2);-o-transform:scale3d(1.2,1.2,1.2);transform:scale3d(1.2,1.2,1.2)}65%,70%{opacity:1;filter:alpha(opacity=100);-webkit-transform:scale3d(.75,.75,.75);-moz-transform:scale3d(.75,.75,.75);-o-transform:scale3d(.75,.75,.75);transform:scale3d(.75,.75,.75)}to{opacity:0;filter:alpha(opacity=0);-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}*{margin:0;padding:0}</style>
<style>@font-face{font-family:"iconfont";src:url(data:font/woff2;base64,d09GMgABAAAAAB8EAAsAAAAAM9gAAB60AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACJZgrPKL8bATYCJAOBPAtgAAQgBYRnB4NXG6gqVQaFjQMgFvbNi6jSBLL/PyRPRERfJHvhuMUYxX7U/1KpwpTlIuGtHlkaq8I//ywN8yKpVbnsC2J+7NNBThcTkeS6J9+NGeEDY1SuGUpJRL8fuu//MJcHiFRaBagRFaBFVeGroqpUJaC+hIUq/MDPrfdjVSyIWrABo0ZMRm9NxRggUVIlCNqAWWc0YAEqKFaCXqOH0WDkeWHFBXOgG8yqOj55Xrr929s5RBLH0YCjLgDmy6m9Jl6cCSwITMmSHSxQkgKBoMChJS7oMrP/Nnr/JrDllm0ukBO2i04JBO8fLnv/bX6Onj4Clk3r1jICYW7Kt1NvDzRAOpIekC4C6FbCK5CNQCJl/n1gYWlxFnDmYZolFuCR4k3p1NVQIFJ7KuG+/L/kO79egQ8rSkEOSkGVLbe8EdyebkQrWUUprKRgF+USe0s3wLnD1mHamqnocu3w8g+UzDn7GZu9D1aNNk4xGsU4Z979fKMAbRR+YvzY8fOY9y4/fMCB7HEuwNqWe7dvXkbeD3CfUJBrYtjbhv5VsEH1Dn0OvNd+X2ZhRyGDCqH2eHT6xtFrLryw0F1ja2vq3/AqvR1cV0AjUAObOBurj/5TmQBGtkkrqKxvdnkJjFMjwENARcdhy4GEB18KAcJoxIiTbkHs3MyTfMts/nSkxCoXv/q1T//+P6fnFyb+WwMpBBZBXJxSpOhjH3Ohl/gMqcxxS/IceX/AA0MyFpwLX69AXDqMh1LtdHDILGxM3gQiH7NOxcTCYyARCw0SCo7N5TVp5FCawLoDUO3DyxYIEAxBEAxDULSDYJEGECyFENADoWI5hI5RCAsFhI1+CActIALUILZYB3HIaaUYsBgiwQaIB9ZDfNEJosAaSABWQ8LQARKJLpAobIKoUYFo0AQSjc2QGKyCxGEZJB2LIAvQBrIZ3SCHMAD5Ga0gt9EM8meuyuV/gD6YjOxHrcBiIlCDIFbCdBrBVDzVC2I9UGtBbIfpbITpydQWEP8EaiWIf8N0lsBCd4QRwFalngvAh3R8Aj07H1nlKaYan35EJUERCIAegyMiYWQRxE7Q8RlhxCbISA2AfAGQJhHQCCGN4ei5CMWC4EgaNkKm2OCOjjH2OgYDodAQKUIIwuwFmKd9AIbzBJ4sT1cKxY5KjWQ70KhCjyQSKdiRYudgSyAS+XSRF05W23CILPxh5sNmsOyJggAcJ9hijRXa2eFkKoVKZHARWybHB7ezoVBUfEzigQhcqJiDz2cw6HSEjhWkBh4iFLq4aoRUhFBcEpuC2JyCGRxgN2BMNJsB9JLbGZYbZuoti/lmOhU4CLUx1VwusRBLwdLzbeeWnGk929CGIW29MuaS/YC2HqDVLN1Xi7HQ7DbB+opOzeLb2gabYHXYiDmjOkzUpEUs0KcMWWaa7ZezdqlNzZXPBg+eGW2VRZ3VVQJAtnV4MTT58Xl2GNoAHsQ3njut2XCx5dzsVFupNxcHBLQMOwufr7wrnnFn3lzGja0r9474XdX5DxQrDDxkykV9Te9DRhYBpM/vMo3vvUBNoJEWSUk1WVGPwSwvE8iexHkIarFw+D6wI6kvIr58yVtvQsoFLOoPAlz/q81nv0x8yZ5xmm9KTySuSSuB06SfPr1Fbj/Tnty8cOMxoi4Lj9M8LmglUoQNRtT6U8od0YFU9hRf50aa5HYrtfUepKIjJdiVXKQpfq9CABT+6LJsnh/uvC8Py7W1eoK72pwM6u2OqFT9bnfVPTe06XSvr7xSbsuX5hXDHNtd/9VX9po2ERxWL5S7kV3v9IbpLc92AMfiDQ07S4OrrI6TXCYocxNv9f0/jgZ+C4RtPGWxdRw2xtI0H2w6GkrCHIX4GGrCbTmlFLl+jOegZ4kofjzIN0xBwqJzietIPdWZYAMhzWCCJyGkJgCkiho0SwszYT11HKY8Qw2a7ztuqk/eq8r90gkLEJ7vrHRmW01WZ1lRWlFVBdH9H0n4bwHpf+T8wuHeTMg4wyYWBji3xEDBililrlKKN1sHMH6s18yUkOq1ytxR4yvupqUoSBRlgtBPDGSkZpGoa26TefMcsXQUrK4upGEHr1plQDjrmt7eLgJ0Qot7g0Karz0zq+5JohIvcxmkCecA4UCTtQLOdxhBlBFV+BtZfb/VMh28M7bleiX51ewHxz0FtE1Dhu4P0yQW5k7P23yxJ7ughm8PpU1AIgLprIh3to4uzbe3X5mRCCaYuLteSG0TXbndcm5xsbXf8Tzi095dNoWdjY6431majyY4ADqlbTI+1l32u0p++Nri8bViOrfubbmWxRTdNFNWxkiwfZolgPNhuzUr+xhLdWygXDzDGSGD1QFltb8msnqCmQISLCueQXhHYeZV5g+yutOjmUaAb7m1vbL+DxPYvOuya9cCFDZMYb0SS7PpYEK8MacYjoTcRMSKCIoEvSPRRBBFz0RvFJIubD/gTOd5IhPK7S+AFEmFCW/v3r1UOXAQSQp6/yAUZfg+6iPFbGtP9mnlFiD+Kx9pbpzJDjMEaTrNV+LK8e7Mk6mbzDjPHeq1gjEXaSO51Ilsjd7Jn2GCGFgHAxCgqH4/zj78mr4l77Q3x4w8hLTIe55sFgEggoWQiwIsD4B7H8WljfGx+z/ppwBSYKD7kUMIQLrzNRPIoLoTsigpA/2D4m9//HxcHBiSVU/2Oj/3GXB9wrHs/aqns0U7JVjlwllJz2eLAgCp8EASdzamZ+1USQBWvNz9xJ17tjnJSnoineXNiAVImIOybCtlARW9aJc4dDLS/WjTk13cG+nmV2ejWP3g0w8Plm+puvr3m1Q8WJjLnvzI3/JsNl1emYc+ZAoy3VU/7n19afabbdyYSJfm315R9dc9Wvbx2ixpO9OeX6hNdyVm5FWpcZpg4NWZ4q3VcGV+6Xa/z+Hd6o6TvN0/+mKueGu30lCH70LaIz9CGgjUi6gODtXVByQAGRoRUA3M7kRaoyxe2HFgI228fgHiS2i3WVJnuQwnGRyyBMXSpEaaD9bhQnxKMEYCpHhUKzDpUajWSQOlJdI0a+8zVTLMEFqzBAPRro5/l5Rl/bJK+UGTsv06NW1hqKR1DBQiQu8HEJC3tKUkSCsn2dKMIUdAHWot7cU9JkizWPpJCAFi6onNAcpa6Dci6EcIAGullQ95ssmD+5FgRfHknJBrq/rE47D18OGNMuwuM+IKc0SdnVypsxpOls9oCb6/553ioyFd2/XGlYxSm6QGKajd8r7m7Z6OL7cT9Gr1pifuV1wSB9kLjrNW7R8ABTxJO8GgEGgXKAueOjtRhgZBkVS1DjBQYBZuB/358jghKXWw/tT3y8XlyvIuSaz6y6YK0yLPV/IXpqar5ysPpZ2dyq43K/O16HZyhXedagV1nxwhVdSU4pJvEyAVWC+rdJLpAyzHKqTO0v78hYsdA4VH011DJR8EUree7p3HFEDeoa0Ht+bkQN7rHCxeutw1VPXRnzpWQUNeSHy/Ad97gkADg9LLrYB0KZ7KTipFDuwSsrfxQJPan39Y6xwE5jlyXhiyRuJS+U2zlDwzT7aLrXK2PXe4wdpGOF5hPFUb2Yo5Z2aqoLH6Bes1qUkshDx6HK8b4fuKlcsk2b6AvS3xplXBHz5DR7l9Rt9SeBmKPTJeWxAOWDlRRKpcjEH2Md3MQ5pnxTzukArxusLaN2hVEMh1KSWyUdQpv70uN0+9BAJLbUvIJhEUYeCob6mCOEHjJAOzJ1yX6YlLQOrJLhqyqwGR30huxbK3253UOfcmPO/4jAUd0SWLWrp6xKjR9Rg5Mff5MBdc8CHjIFWyiDLpchsg8fDMys+74iGVf88chEP8MZFmEfNTS4I/G6g/v9vM5P5SyK4T/Xmnf39N2LMjPWFRFXUZ3F8f3Niu+P07n4QC6eMbbvTmk/alz25f5VtPYRZifdsspxlYh8dbrDY1QZ/V5h/Bp4w63ONBuvbOaCw73lODVLyz4E6Hod1C+ULdnBEfxcy1NqttBGmCLz3q5tpFfZ9U/qxVegnK85TZg3iCcht8pHWX45xR4N5jzKe/YJ2tyZ7IphfANCu8b5UEIdebAJXKO9VgHrN1PoELHJXVdcNgd2vLoZnwpDVLsMz91wKDA9vt9ltEUR3IajDj7opeEGanw8KR3omuTgG3/GD3HZ2ksgkpOymmIpdBir/vgfauZxCSCW0Mj9LxPkhKhr/ILU1kdbChbcgnzR3Z0K8njZww9EGXiOPDASNjpdRzLfa8Fl/2tntUfC06UvRGcJI2i54JJZGxohQBeAUdw53YaMhY90iZ7i2vc3unhdTibE91/nUQKihC0CKplnMq/Mz4NSu3qPaFIm3O4sb+cM11mcKckXGavXoAALn/Uv2ETkr5U+jTPqaQinj0YDhu2laOO9a3SqEqFk7i9SwAl2eZluCvqILzXmcqYodNk3WWemJFNnU2EUyG8k4zdheNSfkog5mPus38+Kxip8mbaSaYK3RcXVZAiMFpnj/BF57PfeofXP5y8aHF/39el3483vjvwL+3Z/X+euncs4ok0vKgzP3eTUHxEyUhGULDeE55znuwePm6/tuZDXWTV1/PDHU9HXU6krS7SR7SaRHOYxcOuFx1uO8w4rIfXO797jLWN7a2XXBu6acjNPiezvT233SGf5IWVnvyvuCAeOScCyyTM+4sK1oYo9jzKvC6tvRWSG9gZ7gH9VnVslVFbb/d2lpSdCptN6i0RjKTvkoSjCM27E2rrLmILD9tKBJ+azQgv81+tFSpgjUu68q/nMjlUrAXBbxFaz3rkBhbboLm2dtPH85wP1gQa//iyafluI6MUqFp70i1SAXyOfJ9N9+KUelRb3slXXKxRSzvksgtcptFkkUQjuUJxfWd/cJx9oHWPQjKRtbOYKez4O1BXJZLKXXaVWm2yUgaNSanX4gSs3BSIEcBGptLIiZhVc7TpCtg/N5e56iMR9VVbCULubgO73juTL8QeoEe+uxFOUj/j3o3Z7s1nGZxi7hMXMqxN/60ILSeZnOoMoZkJIX3JIelhdNaGK21YfmBO7UxFBM5TnBq2x4dMbd3dcB3gdl5hSWM+fQps0/OCVygPF0YTdITvOHZvwzkzMPpj+fx1z53zhrQCrbHgebZo5+rZ4i9T9TxVNrFWwyJvFzR1zj6pTXICk+TT0KGyv9INdXo98pJuxnVRqxixuhtuepXJ5OzCqr/9u94JCivmbHVoB7H9a0jN4O8Zytb/JGZxMWkPLz+8pdDIp4hccq8wpo35YJHHZm0PHwRaRYxQ+WT4GlCVq4+Aidnq47X5xRawC1t80f5ZaHvZNAqTyau/QvxdTLFSz96XmkxgmgnnEha8xcK1vzCTGm6ZP58Sbo0c8gg4Bw8XZIpHWLoV/M5lNeUcOLdrdKde50fa95nKQmssgRFip+vEf2k872i5fJor4WU1xAu3L61mKoQF+/svn+j52BO7mYuMyn+DPsFzeba9TXzJ6WZe3vLNoEQK5hbq6mOjKpW1+EAAQd0LUKdpuoIBhhPvj2p8GV3rWhbx/IT5pKJ4HcIp7fVvjnS/iWU/xMZ36nPI7HncXTuly2DDZ0MpuBDkhwRRPNj9AnXoiHxKioRVw3bWuEkoNraoxZweOvtO+Dm5urCZjKTVGhUMcJTIlKZUA1RUZ/gcz/02DNFTF1R9ZqI1Jwt8d5qX12SPtRW4yMqbQ4LJL5ba8d6u9YtJn66WqKTlOVwW2TN7i+lL++aeZt0j7Kf5Y8s7eLSedr4JK1I4xpfv7BB34VWlGR7hEvKCbAzlz/gzSpg6B30DJsmh6Ye4w2H54sHuylGdIOTIkr7QIR22c7bOBVVvqcQhVH+CxQZTg/RqubT20N24mM5ehsmOe2Yb7q9jpdBTCZYuNlcnTzO10U9bD1yde2KT4xH27ziUkri0luDthBbpbrS2VHl/Kd1jsNc5AZS6LYcpSuAk8vMzpDjjzriJLNluHEc5RSXuA+nPJde0bS/lP6VmpPQ9HaW4k9klrqk/TH1vh2W/1tvnfdaieId7TX/Ne2zkbd9JtvJmQbU11SOR3U0I2XgKYOVzu689lzRtvDb6k9CT3c8NTycxkoRFq+XgFOuXXRExbVlIEwkU6S57e9SRjrud6LQ7hhEryabtK+VXa/kjVluUN8xRJh4q68oLx6DB8YY4Nwo8v81bfNxW9/EirOOuw5/fHss7cjMXvmk1GHo+sXTlyisOhhhv9Zp6v0m5DutbcrklJ3rouMSCmL5sTzkDqSs4Qgeus3Yy9OkSX2ddU46XidjMuu/Wn5oxiSO4I5rI82GxMTt1kva18v9XA3LE/n5ceylNa06mrOg7LevctA6U8DSk3dd4vub+q9svlLVVGWIcMvQqLIclEI1tRSi5vhas605pN24NbJMnASmlkFrP3mynT4iYSWwT21kYtnEPfGtbfF7vLNZFnYqS8ciTisZ6+ocLZlOYgaxUthmJrqOxJl248Y0DvE70DT9u4xzYHumQ1jSFWFG/7JpVbL6ivK+8n9h+t1AUl1GXaaGNfu+mDPcFOJ7YnIHyogxJJliZgoBZcD17JyZrtMksOafOOFqgmcjzjfH+8qi5vmc8vINY8m9hPNMv/aPHq4A3Oi1sbGhuuSB6UdDOIdgUF2QIE5MFN8Q4M59RIcRg75lVELgueZzS9avm8T99IjVCYzl3Zfk+WSQV9BS4TEuRkSu6oa9ZQQBYE+18+q/ovte/VDPkH1AAIQM5PVHLzMtbk2cm9KNl5DMjtG20RP4kzm48a3pY8e2TKND/Q9JsU9LXdIDigQOPbOj1QFGx2RhHm7dwxlYVSVwzvf8PCyw8WyZEa0QJrXWHpwBbJ3MwB/df8MwbdepaPez9j418bw3k0rWzdbwt45+XrfiiOnl37JgsWbag4ISfjvzhUYyGT2IXfjVr10u+cDRN4rtA1tm/Olm/MX4qlOlVv0/PfJMZKjxjBEUXf+99n4DAa57h5cI1V7ymBi5l4Dq7y2PtgyATTOqdMeOba6v10sXK/VpodWb/VnAv8/T868o7IE/ytMLXl+ofHUCpeCN9xsl47UF61m3VzituM3aW4IaaS13z5NlL1+eLctzHzEIOAeXZbvnjTCedJdo187nz4FIvHQJwgdbqKXd+1p4Ld09pbxfsam7u0sjLN29pYIFk9JHReIIWXp8uixCLDrr2uuygzbKG6Utm79p/T4yqfpj/Kd8mU8/HXAtc+l1faggtiONwMuNmFCIP5GhCCic/hDnhvMzaoLIUDMTyH/Dpu54XYEL5V8n1maf2mk+NWZzlU8HueNLN5uvN3GaT22v1elf+wKXBN3Gnr/J1TViAyXB8ekgqe2yHcWonsM5HStKFJkRc4IoTrSPo55DNZIvt5EPPX3ch0J9sZ8p7SJaGVyJfm/KtAtRISpPu52Am+jE4InodWPaJL8CUAxYZ8+eOxeCwjeH6+HY0XRXcE3fnGp9+GYXzq/wMT5W6tWvN226PKGxrP7A6VmzwUnTu3lqiyY7MAPlAJpmNKSjWg1iNkB6YTrhdZ1FtuS52brx6Be9bX6+RDURGRtGzoDqEclR7+hahzsYHB86GhyC3tb/Ful4S+eEOpod1A5mx7/rPjqkO4AhrfU/7yof2NtvvnvHHKI119aa9x60yqv9cKch574GZ5cnTorXfs6+10IHXVStX9oWj0RTK0K1+t9f6Xf1Q5WPt8x/nxBCB4/AVd6LlMhzbG8hsVYI3i3hLXZie297sR3YizB48Y/2GiO8zynTpuwnade0/UZT8XUIPbTs1OkAbycx1wbGnro/Gz195vUKjdUmUBzIHef/3mtjJY4nj3MPiU+fRhC2jQ3HH5n1BuBFFs2wZlQzpgmrOC0sfUYD1eTp5dQHvAfUvkWp/ahjGKNO903bVHXS9ZhyyWxjH/1cbtfmyrOOA6rFc0RZKltZg6e0KN4Uayh0LRaOOGaEpKuUGROyuNckhZKCaFNszI/6cnoJ3aLMCvaax13THFxI5pu4HuUHvStUJP4qD2xHc84QPcu4axGEF5n7+vSDRcUJK3LT8jhXV+7fLw4Sz5oFKQH1iwdFnxdVCHeeOOjsVzcHZzO6UQk2iAaim/5l45x3zIlaU4rhSWpRl5UkhQJ7g4yEw6OR5ODsvtLa4Lyg7OygvODa3K6EEH20fUIzlIQVhoQUhZU05/dc2COMFsWZK5Xd4/lkBk5UVsUZHLUOyU5Zs1eku2e6F08vDy8JCysJL59e4Z3rnbVt9nf2oO8xA5g3BQ1de7d2kzlYXxFv1aMHwv38FL8kX99Ev5QLBlETfVP9zjv6+fgk6eG8IsUnMWk5FTV/VZrRQ+/hrvc07mnQ6XqPW9hz7OTh9/j21G7qKNVEGeOOUUzUUfIbyknZuMJI7dmEqvTPNlGgm+kwb5hqnbu5Y7xSNui4pQv1pbwt4VClc+Sckq0hL49dyhvlWbANFwJTP01wWui8xWmR0y2i3+K80ElJHesGNkph4ifhFuHHJOEtYdJHI/QpUTiBSVq8yEYlU5K6JatgxzkrqZZn3FAUKEA/17b4g4WojQgtO8pgHC0LjdDOX9aHYnggXCJ6DWo92YQvJg8r6ls2Pl3H4zRd2zuDRlBb6I2U3QvUIqtoifCB4VveSlIWnkIhzdOgaB//324m1tiYQ9JPuCOwgyPJvIv4tcIQNnW4tUKLN5Oy6UL2VmT9EHYRLzgCZNkdpS6LeD1NQR2j1A59r4xz8r3BWdA1eVbUjw0DpchOue03/lx/6nz+hHwi2WtMw+zInwo+pmHbDdCiMGefZ1F73y7szpvXUyoLIAgpd6Do1cc7sHUDhFhkeZ5wonD5FFmce1JGTPB8k++EKUe+FRz6fiqz616JxxSMF010Xd7sap97oix++ZSJwjwhca5PZaG0iMy8+98eVqbvVIn4wRP/lqiKqKzIjIqAmqBxg4AD7tSrx7DwWpUty4flS3S4INjW6ot7+Vq55/nhYINl3tlayrDNMCVSOV/13LOlnFGOZfZRe3vQfsdgEY0iMEHDWPV8geUFUu2U5pL5Rht4SRc0Uu44piJVzy0Ln6+yyw6UigiDfsSX4J0392hIDrczZgAxIY+5kscj9ncDWZ3cKvnRuXneX70eqdqIImlgNgR3zgqGLK8Er9hoL/Luj/NOUD4TlABZSreL4dIwt/CLbnnsRlc+0UavbqzRtdfqohr1NrSsuERmnm8/tzDpRUFVdIZuF2D/v32AHVi23qJvNnMm0TY3aVbymvD1creJt9IfwhtaCxP6lrVmO+/0oU1HZigrkzPIU37OsHdMPD+dRs6wvVOvJo+msys4imSsv2ObQaZNP++YaB/pFTvQpsFnNxNwjErXzLV0oaKfb+3JYaCMPXOplzuGJOwQms/OaklCalyyS6VLteJhjMWUVupZIX9qm6vOjgwsVBbDHOuj+3gWs/7kNCY0TLHz6G0A6ye3MDJiBs3HIpmbLJgXs8MzrJC51zxMVv6rb1hUnP4P0RGmwyOsYN/DrmAme/5Xj9OaAgD7E4Pyn53CgvIc2IuF9F+KBWtL6zHWylL6MKYFZqV3WIN8zpBde+UDJs+7hxUQSfswVgXU1kawNtA2eY4VpTHcODZZbiVNK6DpAHAKtigs/sEPK5E8Ax8E9Z7fMTtg+v2CxTAHnMBy5D/cZeHBusFRULnCR6yySnwd+DcMuMA6hfW8c5hGO64Ni65XUxzQXwAAsCH0LFRe9hOW+m9PFwKXsg73fFb4JzLtv6NKxr6Gd2qZ1nG+DIsAgAwoPGQE4F+apBwC1cfzZUPXIgA//L89NkK82Oa+Z20JGhahLfrK3jOrFW/RJeDxrgnU8KnjiKvIBD/4kHYVBQDqcweAf3RaaAMPqpvCDY0UTLbxOxYFEjiyGJBB7MU7y1kC0CCAJQIZIlgqeIGhcRpwoR4wQHAKAMhgrsQiwIYeFgUmnGQxYMOPXrzzbZYAAnjJEoEN/7NUsCCMltFAhhxudRF0hkKZUaFlck7N2ol+g5daR7eyf4gJUaLuvor3qk8giEnYpM4/cnbKRW7Ux/bqoK5ZtZFLsPkScm5frn6lLJuL5Wb2GkFnZcpCmXFetExu09n++X2Dl1rHkN5/KSaM0Imr++UWwvtJKNQGOQlPnX9kJDlFcESVjfrYA+B6V86qZasl2It8CTHU9uX63JQLSy75pzQ9jeh2G320YitQUKJMhSo16jT4R9kktunQpUc/CKM4SbO8KKu6abt+GKd5Wbf9OK/7eT+S26ZgMZq2A2ryFnZto4GPumHFOSJtUhADtGw0r2wqaD3KU2A7smTJ4dpjBlgYXHWPkmHTAw5Ia/UpGV5PAYMsklvGlHZOWzDM1aYUKJF2hisYRdOS2mabe8wZ4rbMHmal7QzWSMx3KeAUmPwqcMNVJksBhWMYSJWepwtvYGHwNjdDgeQPPZAbJN32hvLTyr6TXFJ3B2UzYZEsLOJikvE4ggdtOLeFx4iWZ0WfWF4VCtm2yUbWQienKUgmsxlZfH2tIKK6QBHwBmBdZcwAAAA=)format("woff2")}.iconfont{font-family:"iconfont"!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-home:before{content:""}.icon-touxiang:before{content:""}.icon-zhuti:before{content:""}.icon-riqi:before{content:""}.icon-pinglun:before{content:""}.icon-fanhuidingbu:before{content:""}.icon-erji:before{content:""}.icon-youjian:before{content:""}.icon-github:before{content:""}.code-copy{color:#aaa;fill:#aaa;display:inline-block;cursor:pointer}div[class*=language-] pre .code-copy{position:absolute;z-index:1000;top:7px;right:35px;opacity:0;font-size:16px}div[class*=aside-code] aside:hover .code-copy,div[class*=language-] pre:hover .code-copy{opacity:1}div[class*=language-] pre[class*=language-]{position:static!important}div[class*=language-] pre{-webkit-user-select:text;-moz-user-select:text;user-select:text}p code{-webkit-user-select:all;-moz-user-select:all;user-select:all}@keyframes message-move-in{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@keyframes message-move-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-100%)}}@media (max-width:419px){}body .theme-vdoing-content code{color:var(--textLightenColor);padding:.25rem .5rem;margin:0;font-size:.9em;background-color:hsla(0,0%,39.2%,.08);border-radius:3px}body .theme-vdoing-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}body .theme-vdoing-content pre[class*=language-] code{color:var(--codeColor);padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:var(--codeBg);border-radius:6px}div[class*=language-] pre[class*=language-]{background:transparent;position:relative!important;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.8rem;color:hsla(0,0%,58.8%,.7)}.custom-block .custom-block-title{font-weight:600;margin-bottom:.2rem}.custom-block p{margin:0}.custom-block.tip{padding:.5rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983;color:#215d42}.arrow{width:0;height:0}.arrow.right{border-left:6px solid #ccc}.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.theme-vdoing-content:not(.custom){max-width:860px}@media (max-width:900px){}@media (max-width:720px){}@media (max-width:500px){}body,html{padding:0;margin:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:transparent;font-size:16px;color:#2c3e50;background:var(--bodyBg)}a,button,input{outline:none;-webkit-tap-highlight-color:rgba(255,255,255,0);-webkit-focus-ring-color:transparent}@media (min-width:719px){::-webkit-scrollbar{width:6px;height:5px}::-webkit-scrollbar-track-piece{background-color:rgba(0,0,0,.15);-webkit-border-radius:3px}::-webkit-scrollbar-thumb:vertical{height:5px;background-color:rgba(0,0,0,.28);-webkit-border-radius:3px}::-webkit-scrollbar-thumb:horizontal{width:5px;background-color:rgba(0,0,0,.28);-webkit-border-radius:3px}}@media (max-width:719px){}.blur{-webkit-backdrop-filter:saturate(200%) blur(20px);backdrop-filter:saturate(200%) blur(20px)}body .search-box input{background-color:transparent;color:var(--textColor);border:1px solid var(--borderColor,#ccc)}@media (max-width:959px){body .search-box input{border-color:transparent}}.page{transition:padding .2s ease;padding-left:.8rem}.navbar{position:fixed;z-index:20;top:0;left:0;right:0;height:3.6rem;background-color:var(--blurBg);box-sizing:border-box;box-shadow:0 2px 5px rgba(0,0,0,.06)}.sidebar{font-size:16px;background-color:var(--sidebarBg);width:18rem;position:fixed;z-index:13;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--borderColor);overflow-y:auto;transform:translateX(-100%);transition:transform .2s}@media (max-width:719px){.sidebar{background-color:var(--mainBg)}}.theme-vdoing-content:not(.custom){word-wrap:break-word}.theme-vdoing-content:not(.custom) a:hover{text-decoration:underline}.theme-vdoing-content:not(.custom) img{max-width:100%}a{font-weight:500;text-decoration:none}a{color:#11a8cd}blockquote{font-size:1rem;opacity:.75;border-left:.2rem solid hsla(0,0%,39.2%,.3);margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ul{padding-left:1.2em}h1,h2,h3{font-weight:600;line-height:1.25}.theme-vdoing-content:not(.custom)>h1,.theme-vdoing-content:not(.custom)>h2,.theme-vdoing-content:not(.custom)>h3,.theme-vdoing-content:not(.custom)>h4,.theme-vdoing-content:not(.custom)>h5,.theme-vdoing-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-vdoing-content:not(.custom)>h1:first-child,.theme-vdoing-content:not(.custom)>h2:first-child,.theme-vdoing-content:not(.custom)>h3:first-child,.theme-vdoing-content:not(.custom)>h4:first-child,.theme-vdoing-content:not(.custom)>h5:first-child,.theme-vdoing-content:not(.custom)>h6:first-child{margin-bottom:1rem}.theme-vdoing-content:not(.custom)>h1:first-child+.custom-block,.theme-vdoing-content:not(.custom)>h1:first-child+p,.theme-vdoing-content:not(.custom)>h1:first-child+pre,.theme-vdoing-content:not(.custom)>h2:first-child+.custom-block,.theme-vdoing-content:not(.custom)>h2:first-child+p,.theme-vdoing-content:not(.custom)>h2:first-child+pre,.theme-vdoing-content:not(.custom)>h3:first-child+.custom-block,.theme-vdoing-content:not(.custom)>h3:first-child+p,.theme-vdoing-content:not(.custom)>h3:first-child+pre,.theme-vdoing-content:not(.custom)>h4:first-child+.custom-block,.theme-vdoing-content:not(.custom)>h4:first-child+p,.theme-vdoing-content:not(.custom)>h4:first-child+pre,.theme-vdoing-content:not(.custom)>h5:first-child+.custom-block,.theme-vdoing-content:not(.custom)>h5:first-child+p,.theme-vdoing-content:not(.custom)>h5:first-child+pre,.theme-vdoing-content:not(.custom)>h6:first-child+.custom-block,.theme-vdoing-content:not(.custom)>h6:first-child+p,.theme-vdoing-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}.theme-vdoing-content:not(.custom)>.custom-block:first-child,.theme-vdoing-content:not(.custom)>p:first-child,.theme-vdoing-content:not(.custom)>pre:first-child{margin-top:2rem}h1{font-size:1.9rem}h2{font-size:1.5rem;padding-bottom:.3rem;border-bottom:1px solid var(--borderColor)}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}p,ul{line-height:1.7}@media (max-width:719px){}@media (max-width:719px){}.theme-container{color:var(--textColor);min-height:100vh}@media (min-width:720px){}@media (max-width:959px){.sidebar{font-size:15px}}@media (max-width:719px){.sidebar{width:17.099999999999998rem}}@media (min-width:720px) and (max-width:959px){.sidebar{width:16.2rem}.theme-container.sidebar-open .page{padding-left:17rem!important}}@media (max-width:719px){.sidebar{top:0;height:100vh;padding-top:3.6rem;transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}}@media (max-width:419px){h1{font-size:1.9rem}.theme-vdoing-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}@media (min-width:720px){.theme-container .sidebar-hover-trigger:hover~.sidebar,.theme-container:not(.sidebar-open) .sidebar-hover-trigger~.sidebar:hover{transform:translateX(0);z-index:100}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.sidebar-open .sidebar-button{left:18rem}.theme-container.sidebar-open .page{padding-left:18.8rem}.theme-container.have-rightmenu .page{padding-right:250px}}@media (min-width:720px) and (max-width:959px){.theme-container.sidebar-open:not(.on-sidebar) .sidebar-button{left:12.6rem}}.card-box,.page>:not(.footer){box-shadow:none!important}@media (min-width:940px){.page{padding-top:3.6rem!important}}@media (max-width:719px){}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}@media (max-width:900px){}@media (max-width:719px){}@media (max-width:719px){}@media (max-width:959px){}@media (max-width:720px){}@media (any-hover:hover){}@media (max-width:800px){}@media (max-width:719px){}@media (max-width:390px){}@media (max-width:719px){}@media (max-width:719px){}@media (max-width:1025px){}@media (max-width:719px){}@media (max-width:419px){}@media (max-width:719px){}@keyframes heart-7d2bb426{0%{transform:translate(0)}to{transform:translateY(8px)}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;display:inline-block;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url().6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#11a8cd}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}}@media (max-width:419px){.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}@media (max-width:719px){.sidebar-button{display:block}}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (min-width:720px){.sidebar-button{width:40px;height:40px;display:inline-block;position:fixed;left:0;top:4.6rem;text-align:center;line-height:44px;margin:5px 8px;color:#888;border-radius:50%;padding:0;transition:all .2s}.sidebar-button:hover{background:#11a8cd;color:#fff;box-shadow:0 0 6px #11a8cd}.sidebar-button .icon{display:inline;width:1rem;height:1rem}}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:var(--textColor)}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}@media (max-width:719px){.dropdown-wrapper .dropdown-title{font-weight:600;font-size:inherit}.dropdown-wrapper .dropdown-title:hover{color:#11a8cd}.dropdown-wrapper .dropdown-title .link-title{display:none}.dropdown-wrapper .dropdown-title .title{display:inline-block!important}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--mainBg);padding:.6rem 0;border-bottom-color:var(--borderColor);border:1px solid var(--borderColor);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}.nav-item .dropdown-title a.router-link-active,.nav-item .dropdown-title a:hover{margin-bottom:-2px;border-bottom:2px solid #13b9e2}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#11a8cd}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:959px){.nav-links .nav-item{margin-left:1.2rem}}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:var(--textColor)}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #13b9e2}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem;transition:transform .3s}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:var(--textColor);position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:959px){.navbar .site-name{display:none}}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:860px;padding-top:1rem;padding-bottom:1rem;overflow:auto}@media (max-width:719px){}.page-nav{max-width:860px;padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--borderColor);padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page-nav-centre-wrap .page-nav-centre{position:fixed;top:50%;width:80px;height:70px;margin-top:-35px;outline:0;transition:all .2s;border-radius:3px;opacity:.55;z-index:99}@media (max-width:1340px){.page-nav-centre-wrap .page-nav-centre{width:50px}}@media (max-width:960px){.page-nav-centre-wrap .page-nav-centre{display:none}}.page-nav-centre-wrap .page-nav-centre:hover{background:hsla(0,0%,60%,.15);opacity:1}.page-nav-centre-wrap .page-nav-centre:before{content:"";display:block;width:10px;height:10px;border-top:2px solid #999;border-right:2px solid #999;position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.page-nav-centre-wrap .page-nav-centre-prev:before{transform:rotate(-135deg)}.page-nav-centre-wrap .page-nav-centre-next{right:0}.page-nav-centre-wrap .page-nav-centre-next:before{transform:rotate(45deg)}.sidebar-open .page-nav-centre-wrap .page-nav-centre-prev{left:18rem}.articleInfo-wrap[data-v-06225672]{max-width:860px}.articleInfo-wrap[data-v-06225672]{position:relative;z-index:1;color:#888}.articleInfo-wrap .articleInfo[data-v-06225672]{overflow:hidden;font-size:.92rem}.articleInfo-wrap .articleInfo .breadcrumbs[data-v-06225672]{margin:0;padding:0;overflow:hidden;display:inline-block;line-height:2rem}@media (max-width:960px){.articleInfo-wrap .articleInfo .breadcrumbs[data-v-06225672]{width:100%}}.articleInfo-wrap .articleInfo .breadcrumbs li[data-v-06225672]{list-style-type:none;float:left;padding-right:5px}.articleInfo-wrap .articleInfo .breadcrumbs li[data-v-06225672]:after{content:"/";margin-left:5px;color:#999}.articleInfo-wrap .articleInfo .breadcrumbs li[data-v-06225672]:last-child:after{content:""}.articleInfo-wrap .articleInfo .breadcrumbs li a[data-v-06225672]{color:#888}.articleInfo-wrap .articleInfo .breadcrumbs li a[data-v-06225672]:before{font-size:.92rem}.articleInfo-wrap .articleInfo .breadcrumbs li a[data-v-06225672]:hover{color:#11a8cd}.articleInfo-wrap .articleInfo .breadcrumbs li .icon-home[data-v-06225672]{text-decoration:none}.articleInfo-wrap .articleInfo .info[data-v-06225672]{float:right;line-height:32px}@media (max-width:960px){.articleInfo-wrap .articleInfo .info[data-v-06225672]{float:left}}.articleInfo-wrap .articleInfo .info div[data-v-06225672]{float:left;margin-left:20px;font-size:.8rem}@media (max-width:960px){.articleInfo-wrap .articleInfo .info div[data-v-06225672]{margin:0 20px 0 0}}.articleInfo-wrap .articleInfo .info div[data-v-06225672]:before{margin-right:3px}.articleInfo-wrap .articleInfo .info div a[data-v-06225672]{color:#888}.articleInfo-wrap .articleInfo .info div a[data-v-06225672]:hover{text-decoration:none}.articleInfo-wrap .articleInfo .info div a.beLink[data-v-06225672]:hover{color:#11a8cd;text-decoration:underline}@media (max-width:419px){}@media (max-width:720px){}.right-menu-wrapper{width:230px;float:right;margin-right:-285px;position:sticky;top:0;font-size:.8rem}.right-menu-wrapper .right-menu-margin{margin-top:4.6rem;border-radius:3px;overflow:hidden}.right-menu-wrapper .right-menu-title{padding:10px 15px 0;background:var(--mainBg);font-size:1rem}.right-menu-wrapper .right-menu-title:after{content:"";display:block;width:100%;height:1px;background:var(--borderColor);margin-top:10px}.right-menu-wrapper .right-menu-content{max-height:80vh;position:relative;overflow:hidden;background:var(--mainBg);padding:4px 3px 4px 0}.right-menu-wrapper .right-menu-content::-webkit-scrollbar{width:3px;height:3px}.right-menu-wrapper .right-menu-content::-webkit-scrollbar-track-piece{background:none}.right-menu-wrapper .right-menu-content::-webkit-scrollbar-thumb:vertical{background-color:hsla(0,0%,49%,.3)}.right-menu-wrapper .right-menu-content:hover{overflow-y:auto;padding-right:0}.right-menu-wrapper .right-menu-content .right-menu-item{padding:4px 15px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;position:relative}.right-menu-wrapper .right-menu-content .right-menu-item.level2{font-size:.8rem}.right-menu-wrapper .right-menu-content .right-menu-item.level3{padding-left:27px}.right-menu-wrapper .right-menu-content .right-menu-item a{color:var(--textColor);opacity:.75;display:inline-block;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.right-menu-wrapper .right-menu-content .right-menu-item a:hover{opacity:1}.right-menu-wrapper .right-menu-content:hover{color:#11a8cd}.page>*{max-width:860px;margin:0 auto;padding:1rem 2.5rem 2rem}.page>:not(.footer){background:var(--mainBg);box-shadow:0 1px 2px 0 rgba(0,0,0,.1);margin-bottom:1rem}@media (min-width:940px){.page>:not(.footer){border-radius:2px}}@media (max-width:959px){.page>*{padding:1rem 2rem}}@media (max-width:419px){.page>*{padding:1rem 1.5rem}}.page{padding-bottom:2rem;display:block}@media (max-width:719px){.page{padding-top:3.6rem}}@media (min-width:719px){.page{padding-top:5.1rem}}@media (min-width:719px){}@media (min-width:720px){}.theme-vdoing-wrapper .content-wrapper{position:relative}.theme-vdoing-wrapper h1 img{margin-bottom:-.2rem;margin-right:.2rem;max-width:2.2rem;max-height:2.2rem}.theme-vdoing-wrapper{--linesColor:rgba(50,0,0,0.05)}@media (min-width:720px) and (max-width:1279px){.have-rightmenu .page{padding-right:.8rem!important}}@media (max-width:1279px){.have-rightmenu .right-menu-wrapper{display:none}}@media (min-width:1280px){}@media (min-width:720px){}@media (max-width:719px){}@media (min-width:720px) and (max-width:1279px){}@media (min-width:1280px){}@media (max-width:719px){}@media (max-width:719px){}@media (max-width:719px){}@media (max-width:719px){}@media (max-width:719px){}@media (max-width:719px){}@media (min-width:940px){}@media (max-width:959px){}@media (max-width:419px){}@media (min-width:940px){}@media (max-width:940px){}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-heading{color:var(--textColor);transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}a.sidebar-link{font-size:1em;font-weight:400;color:var(--textColor);border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#11a8cd}a.sidebar-link.active{font-weight:600;color:#11a8cd;border-left-color:#11a8cd}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar>.sidebar-links{padding:1rem 0}}.buttons{position:fixed;right:2rem;bottom:2.5rem;z-index:11}@media (max-width:959px){.buttons{right:1rem;bottom:1.5rem}}.buttons .button{width:2.2rem;height:2.2rem;line-height:2.2rem;border-radius:50%;box-shadow:0 2px 6px rgba(0,0,0,.15);margin-top:.9rem;text-align:center;cursor:pointer;transition:all .5s;background:var(--blurBg)}@media (any-hover:hover){.buttons .button:hover{background:#11a8cd;box-shadow:0 0 15px #11a8cd}.buttons .button:hover:before{color:#fff}}.buttons .button .select-box{margin:0;padding:.8rem 0;position:absolute;bottom:0;right:1.5rem;background:var(--mainBg);border:1px solid var(--borderColor);width:120px;border-radius:6px;box-shadow:0 0 15px hsla(0,0%,100%,.2)}.footer{padding:5rem 1.5rem 2.5rem;text-align:center;color:#666;box-sizing:border-box;font-size:.85rem;transition:all .2s ease}.footer>span{line-height:1.5rem}.footer .icons{margin-bottom:12px}.footer .icons .iconfont{padding:0 10px;font-size:1.3rem}.footer a{color:inherit}.footer a:hover{color:#11a8cd}@media (min-width:720px){.sidebar-open .footer{width:auto;padding-left:19.5rem}}@media (min-width:1520px){.have-rightmenu .footer{padding-right:231.5px}}.theme-mode-light{--customBlockBg:#f1f1f1}.theme-mode-light{--bodyBg:#fff;--mainBg:#fff;--sidebarBg:hsla(0,0%,100%,0.8);--blurBg:hsla(0,0%,100%,0.9);--textColor:#004050;--textLightenColor:#0085ad;--borderColor:rgba(0,0,0,0.15);--codeBg:#f6f6f6;--codeColor:#525252}.theme-mode-light pre[class*=language-]{color:#000;text-shadow:0 1px #fff;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}.theme-mode-light code[class*=language-]::selection,.theme-mode-light code[class*=language-] ::selection,.theme-mode-light pre[class*=language-]::selection,.theme-mode-light pre[class*=language-] ::selection{text-shadow:none;background:#b3d4fc}.theme-mode-light .token.punctuation{color:#999}.theme-mode-light .token.boolean,.theme-mode-light .token.number{color:#905}.theme-mode-light .token.string{color:#690}.theme-mode-light .token.operator{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.theme-mode-light .token.keyword{color:#07a}.custom-html-window{position:fixed;bottom:0;display:flex;overflow:hidden;font-weight:350}@media (max-width:960px){.custom-html-window{display:none}}.custom-html-window .custom-wrapper{position:relative;max-width:200px;max-height:400px}.custom-html-window.custom-html-window-rb{right:80px;z-index:10;justify-content:flex-end}.custom-html-window.custom-html-window-rb>*{align-self:flex-end}</style>
<style>@media (max-width:1000px){}</style><meta name=description content="RuoYi-Vue 全新 Pro 版本，优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue &amp; Element 实现的后台管理系统 + 微信小程序，支持 RBAC 动态权限、数据权限、SaaS 多租户、Activiti + Flowable 工作流、三方登录、支付、短信、商城等功能。"><meta name=keywords content=ruoyi-vue,权限,数据权限,SaaS,多租户,Activiti,Flowable,工作流,商城><meta name=theme-color content=#11a8cd><meta name=referrer content=no-referrer><link rel=icon href=><style>.sf-hidden{display:none!important}</style><link rel=canonical href=https://doc.iocoder.cn/mall/trade-aftersale/><meta http-equiv=content-security-policy content="default-src 'none'; font-src 'self' data:; img-src 'self' data:; style-src 'unsafe-inline'; media-src 'self' data:; script-src 'unsafe-inline' data:; object-src 'self' data:; frame-src 'self' data:;"><style>img[src="data:,"],source[src="data:,"]{display:none!important}</style></head>
 <body class="theme-mode-light theme-style-card">
 <div id=app><div class="theme-container sidebar-open have-rightmenu"><header class="navbar blur"><div title=目录 class=sidebar-button><svg xmlns=http://www.w3.org/2000/svg aria-hidden=true role=img viewBox="0 0 448 512" class=icon><path fill=currentColor d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href=https://doc.iocoder.cn/ class="home-link router-link-active"><img src="" alt="ruoyi-vue-pro 开发指南" class=logo> <span class="site-name can-hide">ruoyi-vue-pro 开发指南</span></a> <div class=links style=max-width:1638px><div class=search-box><input aria-label=Search autocomplete=off spellcheck=false value placeholder> </div> <nav class="nav-links can-hide"><div class=nav-item><div class=dropdown-wrapper><button type=button aria-label=开发指南 class=dropdown-title><a href=https://doc.iocoder.cn/intro/ class=link-title>开发指南</a> <span class=title style=display:none>开发指南</span> <span class="arrow right"></span></button> <ul class=nav-dropdown style=display:none></ul></div></div><div class=nav-item><div class=dropdown-wrapper><button type=button aria-label=项目实战 class=dropdown-title><a href=https://doc.iocoder.cn/bpm/ class=link-title>项目实战</a> <span class=title style=display:none>项目实战</span> <span class="arrow right"></span></button> <ul class=nav-dropdown style=display:none></ul></div></div><div class=nav-item><a href=https://doc.iocoder.cn/video/ class=nav-link>视频教程</a></div><div class=nav-item><div class=dropdown-wrapper><button type=button aria-label=在线体验 class=dropdown-title> <span class=title style=display:>在线体验</span> <span class="arrow right"></span></button> <ul class=nav-dropdown style=display:none></ul></div></div><div class=nav-item><a href=https://github.com/YunaiV/yudao-cloud target=_blank rel="noopener noreferrer" class="nav-link external">
 微服务版
 <span><svg xmlns=http://www.w3.org/2000/svg aria-hidden=true focusable=false x=0px y=0px viewBox="0 0 100 100" width=15 height=15 class="icon outbound"><path fill=currentColor d=M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z></path> <polygon fill=currentColor points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class=sr-only>(opens new window)</span></span></a></div><div class=nav-item><a href=https://www.iocoder.cn/ target=_blank rel="noopener noreferrer" class="nav-link external">
 作者博客
 <span><svg xmlns=http://www.w3.org/2000/svg aria-hidden=true focusable=false x=0px y=0px viewBox="0 0 100 100" width=15 height=15 class="icon outbound"><path fill=currentColor d=M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z></path> <polygon fill=currentColor points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class=sr-only>(opens new window)</span></span></a></div> <a href=https://github.com/YunaiV/ruoyi-vue-pro target=_blank rel="noopener noreferrer" class=repo-link>
 GitHub
 <span><svg xmlns=http://www.w3.org/2000/svg aria-hidden=true focusable=false x=0px y=0px viewBox="0 0 100 100" width=15 height=15 class="icon outbound"><path fill=currentColor d=M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z></path> <polygon fill=currentColor points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class=sr-only>(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask sf-hidden"></div> <div class="sidebar-hover-trigger sf-hidden"></div> <aside class=sidebar> <nav class="nav-links sf-hidden"> </nav> <ul class=sidebar-links><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>萌新必读</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/intro/ class=sidebar-link>简介</a><li><a href=https://doc.iocoder.cn/qun/ class=sidebar-link>交流群</a><li><a href=https://doc.iocoder.cn/video/ class=sidebar-link>视频教程</a><li><a href=https://doc.iocoder.cn/feature/ class=sidebar-link>功能列表</a><li><a href=https://doc.iocoder.cn/quick-start/ class=sidebar-link>快速启动（后端项目）</a><li><a href=https://doc.iocoder.cn/quick-start-front/ class=sidebar-link>快速启动（前端项目）</a><li><a href=https://doc.iocoder.cn/api-doc/ class=sidebar-link>接口文档</a><li><a href=https://doc.iocoder.cn/technology/ class=sidebar-link>技术选型</a><li><a href=https://doc.iocoder.cn/project-intro/ class=sidebar-link>项目结构</a><li><a href=https://doc.iocoder.cn/dev-hot-swap/ class=sidebar-link>代码热加载</a><li><a href=https://doc.iocoder.cn/project-rename/ class=sidebar-link>一键改包</a><li><a href=https://doc.iocoder.cn/delete-code/ class=sidebar-link>删除功能</a><li><a href=https://doc.iocoder.cn/natapp/ class=sidebar-link>内网穿透</a><li><a href=https://doc.iocoder.cn/db-dameng/ class=sidebar-link>达梦数据库专属</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>后端手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/module-new/ class=sidebar-link>新建模块</a><li><a href=https://doc.iocoder.cn/new-feature/ class=sidebar-link>代码生成【单表】（新增功能）</a><li><a href=https://doc.iocoder.cn/new-feature/master-sub/ class=sidebar-link>代码生成【主子表】</a><li><a href=https://doc.iocoder.cn/new-feature/tree/ class=sidebar-link>代码生成（树表）</a><li><a href=https://doc.iocoder.cn/resource-permission/ class=sidebar-link>功能权限</a><li><a href=https://doc.iocoder.cn/data-permission/ class=sidebar-link>数据权限</a><li><a href=https://doc.iocoder.cn/user-center/ class=sidebar-link>用户体系</a><li><a href=https://doc.iocoder.cn/social-user/ class=sidebar-link>三方登录</a><li><a href=https://doc.iocoder.cn/oauth2/ class=sidebar-link>OAuth 2.0（SSO 单点登录)</a><li><a href=https://doc.iocoder.cn/saas-tenant/ class=sidebar-link>SaaS 多租户【字段隔离】</a><li><a href=https://doc.iocoder.cn/saas-tenant/dynamic/ class=sidebar-link>SaaS 多租户【数据库隔离】</a><li><a href=https://doc.iocoder.cn/websocket/ class=sidebar-link>WebSocket 实时通信</a><li><a href=https://doc.iocoder.cn/exception/ class=sidebar-link>异常处理（错误码）</a><li><a href=https://doc.iocoder.cn/validator/ class=sidebar-link>参数校验、时间传参</a><li><a href=https://doc.iocoder.cn/page-feature/ class=sidebar-link>分页实现</a><li><a href=https://doc.iocoder.cn/vo/ class=sidebar-link>VO 对象转换、数据翻译</a><li><a href=https://doc.iocoder.cn/file/ class=sidebar-link>文件存储（上传下载）</a><li><a href=https://doc.iocoder.cn/excel-import-and-export/ class=sidebar-link>Excel 导入导出</a><li><a href=https://doc.iocoder.cn/system-log/ class=sidebar-link>操作日志、访问日志、异常日志</a><li><a href=https://doc.iocoder.cn/mybatis/ class=sidebar-link>MyBatis 数据库</a><li><a href=https://doc.iocoder.cn/mybatis-pro/ class=sidebar-link>MyBatis 联表&amp;分页查询</a><li><a href=https://doc.iocoder.cn/dynamic-datasource/ class=sidebar-link>多数据源（读写分离）、事务</a><li><a href=https://doc.iocoder.cn/redis-cache/ class=sidebar-link>Redis 缓存</a><li><a href=https://doc.iocoder.cn/local-cache/ class=sidebar-link>本地缓存</a><li><a href=https://doc.iocoder.cn/async-task/ class=sidebar-link>异步任务</a><li><a href=https://doc.iocoder.cn/distributed-lock/ class=sidebar-link>分布式锁</a><li><a href=https://doc.iocoder.cn/idempotent/ class=sidebar-link>幂等性（防重复提交）</a><li><a href=https://doc.iocoder.cn/rate-limiter/ class=sidebar-link>请求限流（RateLimiter）</a><li><a href=https://doc.iocoder.cn/unit-test/ class=sidebar-link>单元测试</a><li><a href=https://doc.iocoder.cn/captcha/ class=sidebar-link>验证码</a><li><a href=https://doc.iocoder.cn/util/ class=sidebar-link>工具类 Util</a><li><a href=https://doc.iocoder.cn/config-center/ class=sidebar-link>配置管理</a><li><a href=https://doc.iocoder.cn/db-doc/ class=sidebar-link>数据库文档</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>中间件手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/job/ class=sidebar-link>定时任务</a><li><a href=https://doc.iocoder.cn/message-queue/event/ class=sidebar-link>消息队列（内存）</a><li><a href=https://doc.iocoder.cn/message-queue/redis/ class=sidebar-link>消息队列（Redis）</a><li><a href=https://doc.iocoder.cn/message-queue/rocketmq/ class=sidebar-link>消息队列（RocketMQ）</a><li><a href=https://doc.iocoder.cn/message-queue/rabbitmq/ class=sidebar-link>消息队列（RabbitMQ）</a><li><a href=https://doc.iocoder.cn/message-queue/kafka/ class=sidebar-link>消息队列（Kafka）</a><li><a href=https://doc.iocoder.cn/server-protection/ class=sidebar-link>限流熔断</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>工作流手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/bpm-preview/ class=sidebar-link>工作流演示</a><li><a href=https://doc.iocoder.cn/bpm/ class=sidebar-link>功能开启</a><li><a href=https://doc.iocoder.cn/bpm/dameng/ class=sidebar-link>工作流（达梦适配）</a><li><a href=https://doc.iocoder.cn/bpm/use-bpm-form/ class=sidebar-link>审批接入（流程表单）</a><li><a href=https://doc.iocoder.cn/bpm/use-business-form/ class=sidebar-link>审批接入（业务表单）</a><li><a href=https://doc.iocoder.cn/bpm/model-designer-bpmn/ class=sidebar-link>流程设计器（BPMN）</a><li><a href=https://doc.iocoder.cn/bpm/model-designer-dingding/ class=sidebar-link>流程设计器（钉钉、飞书）</a><li><a href=https://doc.iocoder.cn/bpm/assignee/ class=sidebar-link>选择审批人、发起人自选</a><li><a href=https://doc.iocoder.cn/bpm/multi-instance/ class=sidebar-link>会签、或签、依次审批</a><li><a href=https://doc.iocoder.cn/bpm/process-instance/ class=sidebar-link>流程发起、取消、重新发起</a><li><a href=https://doc.iocoder.cn/bpm/task-todo-done/ class=sidebar-link>审批通过、不通过、驳回</a><li><a href=https://doc.iocoder.cn/bpm/sign/ class=sidebar-link>审批加签、减签</a><li><a href=https://doc.iocoder.cn/bpm/task-delegation-and-cc/ class=sidebar-link>审批转办、委派、抄送</a><li><a href=https://doc.iocoder.cn/bpm/listener/ class=sidebar-link>执行监听器、任务监听器</a><li><a href=https://doc.iocoder.cn/bpm/expression/ class=sidebar-link>流程表达式</a><li><a href=https://doc.iocoder.cn/bpm/message/ class=sidebar-link>流程审批通知</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>大屏手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/report/ class=sidebar-link>报表设计器</a><li><a href=https://doc.iocoder.cn/report/screen/ class=sidebar-link>大屏设计器</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>支付手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/pay/build/ class=sidebar-link>功能开启</a><li><a href=https://doc.iocoder.cn/pay/alipay-pay-demo/ class=sidebar-link>支付宝支付接入</a><li><a href=https://doc.iocoder.cn/pay/wx-pub-pay-demo/ class=sidebar-link>微信公众号支付接入</a><li><a href=https://doc.iocoder.cn/pay/wx-lite-pay-demo/ class=sidebar-link>微信小程序支付接入</a><li><a href=https://doc.iocoder.cn/pay/refund-demo/ class=sidebar-link>支付宝、微信退款接入</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>会员手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/member/build/ class=sidebar-link>功能开启</a><li><a href=https://doc.iocoder.cn/member/weixin-mp-login/ class=sidebar-link>微信公众号登录</a><li><a href=https://doc.iocoder.cn/member/weixin-lite-login/ class=sidebar-link>微信小程序登录</a><li><a href=https://doc.iocoder.cn/member/user/ class=sidebar-link>会员用户、标签、分组</a><li><a href=https://doc.iocoder.cn/member/level/ class=sidebar-link>会员等级、积分、签到</a></ul></section><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>商城手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/mall-preview/ class=sidebar-link>商城演示</a><li><a href=https://doc.iocoder.cn/mall/build/ class=sidebar-link>功能开启</a><li><a href=https://doc.iocoder.cn/mall/diy/ class=sidebar-link>商城装修</a><li><a href=https://doc.iocoder.cn/mall/product-category/ class=sidebar-link>【商品】商品分类</a><li><a href=https://doc.iocoder.cn/mall/product-property/ class=sidebar-link>【商品】商品属性</a><li><a href=https://doc.iocoder.cn/mall/product-spu-sku/ class=sidebar-link>【商品】商品 SPU 与 SKU</a><li><a href=https://doc.iocoder.cn/mall/product-comment/ class=sidebar-link>【商品】商品评价</a><li><a href=https://doc.iocoder.cn/mall/trade-cart/ class=sidebar-link>【交易】购物车</a><li><a href=https://doc.iocoder.cn/mall/trade-order/ class=sidebar-link>【交易】交易订单</a><li><a href=https://doc.iocoder.cn/mall/trade-aftersale/ class="active sidebar-link" aria-current=page>【交易】售后退款</a><ul class="sidebar-sub-headers sf-hidden"></ul><li><a href=https://doc.iocoder.cn/mall/trade-delivery-express/ class=sidebar-link>【交易】快递发货</a><li><a href=https://doc.iocoder.cn/mall/trade-delivery-pickup/ class=sidebar-link>【交易】门店自提</a><li><a href=https://doc.iocoder.cn/mall/trade-brokerage/ class=sidebar-link>【交易】分销返佣</a><li><a href=https://doc.iocoder.cn/mall/promotion-coupon/ class=sidebar-link>【营销】优惠劵</a><li><a href=https://doc.iocoder.cn/mall/promotion-combination/ class=sidebar-link>【营销】拼团活动</a><li><a href=https://doc.iocoder.cn/mall/promotion-seckill/ class=sidebar-link>【营销】秒杀活动</a><li><a href=https://doc.iocoder.cn/mall/promotion-bargain/ class=sidebar-link>【营销】砍价活动</a><li><a href=https://doc.iocoder.cn/mall/promotion-record/ class=sidebar-link>【营销】满减送</a><li><a href=https://doc.iocoder.cn/mall/promotion-discount/ class=sidebar-link>【营销】限时折扣</a><li><a href=https://doc.iocoder.cn/mall/promotion-content/ class=sidebar-link>【营销】内容管理</a><li><a href=https://doc.iocoder.cn/mall/statistics/ class=sidebar-link>【统计】会员、商品、交易统计</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>ERP手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/erp-preview/ class=sidebar-link>ERP 演示</a><li><a href=https://doc.iocoder.cn/erp/build/ class=sidebar-link>功能开启</a><li><a href=https://doc.iocoder.cn/erp/product/ class=sidebar-link>【产品】产品信息、分类、单位</a><li><a href=https://doc.iocoder.cn/erp/stock/ class=sidebar-link>【库存】产品库存、库存明细</a><li><a href=https://doc.iocoder.cn/erp/stock-in-out/ class=sidebar-link>【库存】其它入库、其它出库</a><li><a href=https://doc.iocoder.cn/erp/stock-move-check/ class=sidebar-link>【库存】库存调拨、库存盘点</a><li><a href=https://doc.iocoder.cn/erp/purchase/ class=sidebar-link>【采购】采购订单、入库、退货</a><li><a href=https://doc.iocoder.cn/erp/sale/ class=sidebar-link>【销售】销售订单、出库、退货</a><li><a href=https://doc.iocoder.cn/sale/finance-payment-receipt/ class=sidebar-link>【财务】采购付款、销售收款</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>CRM手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/crm-preview/ class=sidebar-link>CRM 演示</a><li><a href=https://doc.iocoder.cn/crm/build/ class=sidebar-link>功能开启</a><li><a href=https://doc.iocoder.cn/crm/clue/ class=sidebar-link>【线索】线索管理</a><li><a href=https://doc.iocoder.cn/crm/customer/ class=sidebar-link>【客户】客户管理、公海客户</a><li><a href=https://doc.iocoder.cn/crm/business/ class=sidebar-link>【商机】商机管理、商机状态</a><li><a href=https://doc.iocoder.cn/crm/contract/ class=sidebar-link>【合同】合同管理、合同提醒</a><li><a href=https://doc.iocoder.cn/crm/receivable/ class=sidebar-link>【回款】回款管理、回款计划</a><li><a href=https://doc.iocoder.cn/crm/product/ class=sidebar-link>【产品】产品管理、产品分类</a><li><a href=https://doc.iocoder.cn/crm/permission/ class=sidebar-link>【通用】数据权限</a><li><a href=https://doc.iocoder.cn/crm/follow-up/ class=sidebar-link>【通用】跟进记录、待办事项</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>公众号手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/mp/build/ class=sidebar-link>功能开启</a><li><a href=https://doc.iocoder.cn/mp/account/ class=sidebar-link>公众号接入</a><li><a href=https://doc.iocoder.cn/mp/user/ class=sidebar-link>公众号粉丝</a><li><a href=https://doc.iocoder.cn/mp/tag/ class=sidebar-link>公众号标签</a><li><a href=https://doc.iocoder.cn/mp/message/ class=sidebar-link>公众号消息</a><li><a href=https://doc.iocoder.cn/mp/auto-reply/ class=sidebar-link>自动回复</a><li><a href=https://doc.iocoder.cn/mp/menu/ class=sidebar-link>公众号菜单</a><li><a href=https://doc.iocoder.cn/mp/material/ class=sidebar-link>公众号素材</a><li><a href=https://doc.iocoder.cn/mp/article/ class=sidebar-link>公众号图文</a><li><a href=https://doc.iocoder.cn/mp/statistics/ class=sidebar-link>公众号统计</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>系统手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/sms/ class=sidebar-link>短信配置</a><li><a href=https://doc.iocoder.cn/mail/ class=sidebar-link>邮件配置</a><li><a href=https://doc.iocoder.cn/notify/ class=sidebar-link>站内信配置</a><li><a href=https://doc.iocoder.cn/desensitize/ class=sidebar-link>数据脱敏</a><li><a href=https://doc.iocoder.cn/sensitive-word/ class=sidebar-link>敏感词</a><li><a href=https://doc.iocoder.cn/area-and-ip/ class=sidebar-link>地区 &amp; IP 库</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>运维手册</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/dev-env/ class=sidebar-link>开发环境</a><li><a href=https://doc.iocoder.cn/deployment-linux/ class=sidebar-link>Linux 部署</a><li><a href=https://doc.iocoder.cn/deployment-docker/ class=sidebar-link>Docker 部署</a><li><a href=https://doc.iocoder.cn/deployment-jenkins/ class=sidebar-link>Jenkins 部署</a><li><a href=https://doc.iocoder.cn/https/ class=sidebar-link>HTTPS 证书</a><li><a href=https://doc.iocoder.cn/server-monitor/ class=sidebar-link>服务监控</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>前端手册 Vue 3.x</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/vue3/dev-spec/ class=sidebar-link>开发规范</a><li><a href=https://doc.iocoder.cn/vue3/route/ class=sidebar-link>菜单路由</a><li><a href=https://doc.iocoder.cn/vue3/icon/ class=sidebar-link>Icon 图标</a><li><a href=https://doc.iocoder.cn/vue3/dict/ class=sidebar-link>字典数据</a><li><a href=https://doc.iocoder.cn/vue3/components/ class=sidebar-link>系统组件</a><li><a href=https://doc.iocoder.cn/vue3/util/ class=sidebar-link>通用方法</a><li><a href=https://doc.iocoder.cn/vue3/config-center/ class=sidebar-link>配置读取</a><li><a href=https://doc.iocoder.cn/vue3/crud-schema/ class=sidebar-link>CRUD 组件</a><li><a href=https://doc.iocoder.cn/vue3/i18n/ class=sidebar-link>国际化</a><li><a href=https://doc.iocoder.cn/vue3/debugger/ class=sidebar-link>IDE 调试</a><li><a href=https://doc.iocoder.cn/vue3/format/ class=sidebar-link>代码格式化</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>前端手册 Vue 2.x</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/vue2/dev-spec/ class=sidebar-link>开发规范</a><li><a href=https://doc.iocoder.cn/vue2/route/ class=sidebar-link>菜单路由</a><li><a href=https://doc.iocoder.cn/vue2/icon/ class=sidebar-link>Icon 图标</a><li><a href=https://doc.iocoder.cn/vue2/dict/ class=sidebar-link>字典数据</a><li><a href=https://doc.iocoder.cn/vue2/components/ class=sidebar-link>系统组件</a><li><a href=https://doc.iocoder.cn/vue2/util/ class=sidebar-link>通用方法</a><li><a href=https://doc.iocoder.cn/vue2/config-center/ class=sidebar-link>配置读取</a></ul></section><li><section class="sidebar-group depth-0"><p class=sidebar-heading><span>更新日志</span> </p> <ul class="sidebar-links sidebar-group-items"><li><a href=https://doc.iocoder.cn/changelog/2.1.0/ class=sidebar-link>【v2.1.0】开发中</a><li><a href=https://doc.iocoder.cn/changelog/2.0.1/ class=sidebar-link>【v2.0.1】2024-03-01</a><li><a href=https://doc.iocoder.cn/changelog/2.0.0/ class=sidebar-link>【v2.0.0】2024-01-26</a><li><a href=https://doc.iocoder.cn/changelog/1.9.0/ class=sidebar-link>【v1.9.0】2023-12-01</a><li><a href=https://doc.iocoder.cn/changelog/1.8.3/ class=sidebar-link>【v1.8.3】2023-10-24</a></ul></section></ul> </aside> <div><main class=page><div class=theme-vdoing-wrapper><div data-v-06225672 class=articleInfo-wrap><div data-v-06225672 class=articleInfo><ul data-v-06225672 class=breadcrumbs><li data-v-06225672><a data-v-06225672 href=https://doc.iocoder.cn/ class="iconfont icon-home router-link-active" title=首页></a></li> <li data-v-06225672><span data-v-06225672>开发指南</span><li data-v-06225672><span data-v-06225672>商城手册</span></ul> <div data-v-06225672 class=info><div data-v-06225672 title=作者 class="author iconfont icon-touxiang"><a data-v-06225672 href=https://www.iocoder.cn/ target=_blank title=作者 class=beLink>芋道源码</a></div> <div data-v-06225672 title=创建时间 class="date iconfont icon-riqi"><a data-v-06225672 href=javascript:void(0)>2024-01-15</a></div> </div></div></div> <div class=content-wrapper><div class=right-menu-wrapper><div class=right-menu-margin><div class=right-menu-title>目录</div> <div class=right-menu-content><div class="right-menu-item level2"><a href=#_1-%E8%A1%A8%E7%BB%93%E6%9E%84>1. 表结构</a></div><div class="right-menu-item level3"><a href=#_1-1-%E5%94%AE%E5%90%8E%E8%AE%A2%E5%8D%95%E8%A1%A8>1.1 售后订单表</a></div><div class="right-menu-item level3"><a href=#_1-2-%E5%94%AE%E5%90%8E%E8%AE%A2%E5%8D%95%E6%97%A5%E5%BF%97%E8%A1%A8>1.2 售后订单日志表</a></div><div class="right-menu-item level2"><a href=#_2-%E5%94%AE%E5%90%8E%E6%B5%81%E7%A8%8B>2. 售后流程</a></div><div class="right-menu-item level3"><a href=#_2-1-%E7%94%B3%E8%AF%B7%E3%80%90%E4%B9%B0%E5%AE%B6%E3%80%91>2.1 申请【买家】</a></div><div class="right-menu-item level3"><a href=#_2-2-%E5%AE%A1%E6%89%B9%E3%80%90%E5%8D%96%E5%AE%B6%E3%80%91>2.2 审批【卖家】</a></div><div class="right-menu-item level3"><a href=#_2-3-%E9%80%80%E8%B4%A7%E3%80%90%E4%B9%B0%E5%AE%B6%E3%80%91>2.3 退货【买家】</a></div><div class="right-menu-item level3"><a href=#_2-4-%E6%94%B6%E8%B4%A7%E3%80%90%E5%8D%96%E5%AE%B6%E3%80%91>2.4 收货【卖家】</a></div><div class="right-menu-item level3"><a href=#_2-5-%E9%80%80%E6%AC%BE%E3%80%90%E5%8D%96%E5%AE%B6%E3%80%91>2.5 退款【卖家】</a></div><div class="right-menu-item level2"><a href=#_3-%E5%94%AE%E5%90%8E%E9%85%8D%E7%BD%AE>3. 售后配置</a></div></div></div></div> <h1><img src="">【交易】售后退款</h1> <div class="theme-vdoing-content content__default"><h2 id=_1-表结构><a href=#_1-%E8%A1%A8%E7%BB%93%E6%9E%84 class=header-anchor>#</a> 1. 表结构</h2> <p>售后退款，由 <code>yudao-module-trade-biz</code> 后端模块的 <code>aftersale</code> 包实现，分成二个表：</p> <p><img src="" alt=表关系 style=cursor:zoom-in></p> <ul><li><code>trade_after_sale_</code>：售后订单表</li> <li><code>trade_after_sale_log</code>：售后订单日志表</ul> <h3 id=_1-1-售后订单表><a href=#_1-1-%E5%94%AE%E5%90%8E%E8%AE%A2%E5%8D%95%E8%A1%A8 class=header-anchor>#</a> 1.1 售后订单表</h3> <blockquote><p>省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段</p></blockquote> <div class="language-SQL extra-class"><pre class="language-sql codecopy-enabled"><code><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> <span class="token identifier"><span class="token punctuation">`</span>trade_after_sale<span class="token punctuation">`</span></span> <span class="token punctuation">(</span>
  <span class="token identifier"><span class="token punctuation">`</span>id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">AUTO_INCREMENT</span> <span class="token keyword">COMMENT</span> <span class="token string">'售后编号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>no<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'售后单号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>user_id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token keyword">unsigned</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'用户编号'</span><span class="token punctuation">,</span>
  
  <span class="token identifier"><span class="token punctuation">`</span>type<span class="token punctuation">`</span></span> <span class="token keyword">tinyint</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'售后类型'</span><span class="token punctuation">,</span>

  <span class="token identifier"><span class="token punctuation">`</span>status<span class="token punctuation">`</span></span> <span class="token keyword">int</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token string">'0'</span> <span class="token keyword">COMMENT</span> <span class="token string">'售后状态'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>way<span class="token punctuation">`</span></span> <span class="token keyword">tinyint</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'售后方式'</span><span class="token punctuation">,</span>
  
  <span class="token identifier"><span class="token punctuation">`</span>refund_price<span class="token punctuation">`</span></span> <span class="token keyword">int</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token string">'0'</span> <span class="token keyword">COMMENT</span> <span class="token string">'退款金额，单位：分'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>apply_reason<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'申请原因'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>apply_description<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'补充描述'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>apply_pic_urls<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'补充凭证图片'</span><span class="token punctuation">,</span>
  
  <span class="token identifier"><span class="token punctuation">`</span>order_id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token keyword">unsigned</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'订单编号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>order_no<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'订单流水号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>order_item_Id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token keyword">unsigned</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'订单项编号'</span><span class="token punctuation">,</span>
  
  <span class="token identifier"><span class="token punctuation">`</span>spu_id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token keyword">unsigned</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'商品 SPU 编号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>spu_name<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'商品 SPU 名称'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>sku_id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token keyword">unsigned</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'商品 SKU 编号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>properties<span class="token punctuation">`</span></span> json <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'商品属性数组，JSON 格式'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>pic_url<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'商品图片'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>count<span class="token punctuation">`</span></span> <span class="token keyword">int</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'购买数量'</span><span class="token punctuation">,</span>
  
  <span class="token identifier"><span class="token punctuation">`</span>audit_time<span class="token punctuation">`</span></span> <span class="token keyword">datetime</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">CURRENT_TIMESTAMP</span> <span class="token keyword">COMMENT</span> <span class="token string">'审批时间'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>audit_user_id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token keyword">unsigned</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'审批人'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>audit_reason<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'审批备注'</span><span class="token punctuation">,</span>
  
  <span class="token identifier"><span class="token punctuation">`</span>logistics_id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'退货物流公司编号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>logistics_no<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">64</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'退货物流单号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>delivery_time<span class="token punctuation">`</span></span> <span class="token keyword">datetime</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'退货时间'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>receive_time<span class="token punctuation">`</span></span> <span class="token keyword">datetime</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'收货时间'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>receive_reason<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'收货备注'</span><span class="token punctuation">,</span>
  
  <span class="token identifier"><span class="token punctuation">`</span>pay_refund_id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token keyword">unsigned</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'支付退款编号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>refund_time<span class="token punctuation">`</span></span> <span class="token keyword">datetime</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">CURRENT_TIMESTAMP</span> <span class="token keyword">COMMENT</span> <span class="token string">'退款时间'</span><span class="token punctuation">,</span>

  <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span> <span class="token punctuation">(</span><span class="token identifier"><span class="token punctuation">`</span>id<span class="token punctuation">`</span></span><span class="token punctuation">)</span> <span class="token keyword">USING</span> <span class="token keyword">BTREE</span>
<span class="token punctuation">)</span> <span class="token keyword">ENGINE</span><span class="token operator">=</span><span class="token keyword">InnoDB</span> <span class="token keyword">AUTO_INCREMENT</span><span class="token operator">=</span><span class="token number">23</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">CHARSET</span><span class="token operator">=</span>utf8mb4 <span class="token keyword">COLLATE</span><span class="token operator">=</span>utf8mb4_bin <span class="token keyword">COMMENT</span><span class="token operator">=</span><span class="token string">'售后订单'</span><span class="token punctuation">;</span>
</code><i class=code-copy title="Copy to clipboard"><svg style=color:#aaa;font-size:14px t=1572422231464 class=icon viewBox="0 0 1024 1024" version=1.1 xmlns=http://www.w3.org/2000/svg p-id=3201 width=14 height=14><path d="M866.461538 39.384615H354.461538c-43.323077 0-78.769231 35.446154-78.76923 78.769231v39.384616h472.615384c43.323077 0 78.769231 35.446154 78.769231 78.76923v551.384616h39.384615c43.323077 0 78.769231-35.446154 78.769231-78.769231V118.153846c0-43.323077-35.446154-78.769231-78.769231-78.769231z m-118.153846 275.692308c0-43.323077-35.446154-78.769231-78.76923-78.769231H157.538462c-43.323077 0-78.769231 35.446154-78.769231 78.769231v590.769231c0 43.323077 35.446154 78.769231 78.769231 78.769231h512c43.323077 0 78.769231-35.446154 78.76923-78.769231V315.076923z m-354.461538 137.846154c0 11.815385-7.876923 19.692308-19.692308 19.692308h-157.538461c-11.815385 0-19.692308-7.876923-19.692308-19.692308v-39.384615c0-11.815385 7.876923-19.692308 19.692308-19.692308h157.538461c11.815385 0 19.692308 7.876923 19.692308 19.692308v39.384615z m157.538461 315.076923c0 11.815385-7.876923 19.692308-19.692307 19.692308H216.615385c-11.815385 0-19.692308-7.876923-19.692308-19.692308v-39.384615c0-11.815385 7.876923-19.692308 19.692308-19.692308h315.076923c11.815385 0 19.692308 7.876923 19.692307 19.692308v39.384615z m78.769231-157.538462c0 11.815385-7.876923 19.692308-19.692308 19.692308H216.615385c-11.815385 0-19.692308-7.876923-19.692308-19.692308v-39.384615c0-11.815385 7.876923-19.692308 19.692308-19.692308h393.846153c11.815385 0 19.692308 7.876923 19.692308 19.692308v39.384615z" p-id=3202></path></svg></i></pre></div><p>字段还是非常多的，我们来分块来看看。</p> <p>① <code>no</code> 字段：售后单号，主要展示给用户看，由 TradeNoRedisDAO 的 <code>#generate(...)</code> 方法生成。</p> <p>而 <code>id</code> 字段是数据库自增的订单编号，系统内部使用，一般不展示给用户查看。</p> <p>② 【类型】<code>type</code> 字段：售后类型，由 AfterSaleTypeEnum 枚举，分成两种类型：</p> <ul><li>售中退款：交易完成【前】买家申请退款</li> <li>售后退款：交易完成【后】买家申请退款</ul> <p>③ 【状态】<code>status</code> 字段：订单状态，由 AfterSaleStatusEnum 枚举，流转状态如下图：</p> <p><img src="" alt=售后状态流转 style=cursor:zoom-in></p> <p><code>way</code> 字段：售后方式，由 AfterSaleWayEnum 枚举，分成两种方式：仅退款、退货退款。如上图所示，退款会多 SELLER_AGREE、BUYER_DELIVERY 两个动作。</p> <p>④ 【申请】<code>refund_price</code>、<code>apply_reason</code>、<code>apply_description</code>、<code>apply_pic_urls</code> 字段：买家发起售后的基本信息。</p> <p>⑤ 【订单】<code>order_id</code>、<code>order_no</code>、<code>order_item_Id</code> 字段：关联的订单项信息，一个 <code>trade_order_item</code> 可以发起多次售后，同一时间只允许一个，并且最终只能有一个成功。</p> <p>如果你希望一个售后订单可以退多个订单项，需要自己加个 <code>trade_after_sale_item</code> 表，将部分【订单信息】【商品信息】挪过去。</p> <p>⑥ 【商品】<code>spu_id</code>、<code>sku_id</code>、<code>count</code> 字段：关联的商品信息。冗余的 <code>spu_name</code>、<code>pic_url</code>、<code>properties</code> 字段，是为了方便查询。</p> <p>⑦ 【审核】<code>audit_time</code>、<code>audit_user_id</code>、<code>audit_reason</code> 字段：卖家审核的信息。</p> <p>⑧ 【退货】<code>logistics_id</code>、<code>logistics_no</code>、<code>delivery_time</code> 字段：买家退货的信息。</p> <p><code>receive_time</code>、<code>receive_reason</code> 字段：卖家收货的信息。</p> <p>⑨ 【退款】<code>pay_refund_id</code>、<code>refund_time</code> 字段：退款的信息。 其中，<code>pay_refund_id</code> 关联的支付中心的退款单号。对支付中心还不了解的同学，可以阅读下 <a href=https://doc.iocoder.cn/pay/build/>《支付手册》</a> 文档。</p> <h3 id=_1-2-售后订单日志表><a href=#_1-2-%E5%94%AE%E5%90%8E%E8%AE%A2%E5%8D%95%E6%97%A5%E5%BF%97%E8%A1%A8 class=header-anchor>#</a> 1.2 售后订单日志表</h3> <blockquote><p>省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段</p></blockquote> <div class="language-SQL extra-class"><pre class="language-sql codecopy-enabled"><code><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> <span class="token identifier"><span class="token punctuation">`</span>trade_after_sale_log<span class="token punctuation">`</span></span> <span class="token punctuation">(</span>
  <span class="token identifier"><span class="token punctuation">`</span>id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">AUTO_INCREMENT</span> <span class="token keyword">COMMENT</span> <span class="token string">'编号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>user_id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'用户编号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>user_type<span class="token punctuation">`</span></span> <span class="token keyword">tinyint</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'用户类型'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>after_sale_id<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'售后编号'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>before_status<span class="token punctuation">`</span></span> <span class="token keyword">tinyint</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'售后状态（之前）'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>after_status<span class="token punctuation">`</span></span> <span class="token keyword">tinyint</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'售后状态（之后）'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>operate_type<span class="token punctuation">`</span></span> <span class="token keyword">tinyint</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'操作类型'</span><span class="token punctuation">,</span>
  <span class="token identifier"><span class="token punctuation">`</span>content<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">512</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_bin <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'操作明细'</span><span class="token punctuation">,</span>
  <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span> <span class="token punctuation">(</span><span class="token identifier"><span class="token punctuation">`</span>id<span class="token punctuation">`</span></span><span class="token punctuation">)</span> <span class="token keyword">USING</span> <span class="token keyword">BTREE</span>
<span class="token punctuation">)</span> <span class="token keyword">ENGINE</span><span class="token operator">=</span><span class="token keyword">InnoDB</span> <span class="token keyword">AUTO_INCREMENT</span><span class="token operator">=</span><span class="token number">32</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">CHARSET</span><span class="token operator">=</span>utf8mb4 <span class="token keyword">COLLATE</span><span class="token operator">=</span>utf8mb4_bin <span class="token keyword">COMMENT</span><span class="token operator">=</span><span class="token string">'售后订单日志'</span><span class="token punctuation">;</span>
</code><i class=code-copy title="Copy to clipboard"><svg style=color:#aaa;font-size:14px t=1572422231464 class=icon viewBox="0 0 1024 1024" version=1.1 xmlns=http://www.w3.org/2000/svg p-id=3201 width=14 height=14><path d="M866.461538 39.384615H354.461538c-43.323077 0-78.769231 35.446154-78.76923 78.769231v39.384616h472.615384c43.323077 0 78.769231 35.446154 78.769231 78.76923v551.384616h39.384615c43.323077 0 78.769231-35.446154 78.769231-78.769231V118.153846c0-43.323077-35.446154-78.769231-78.769231-78.769231z m-118.153846 275.692308c0-43.323077-35.446154-78.769231-78.76923-78.769231H157.538462c-43.323077 0-78.769231 35.446154-78.769231 78.769231v590.769231c0 43.323077 35.446154 78.769231 78.769231 78.769231h512c43.323077 0 78.769231-35.446154 78.76923-78.769231V315.076923z m-354.461538 137.846154c0 11.815385-7.876923 19.692308-19.692308 19.692308h-157.538461c-11.815385 0-19.692308-7.876923-19.692308-19.692308v-39.384615c0-11.815385 7.876923-19.692308 19.692308-19.692308h157.538461c11.815385 0 19.692308 7.876923 19.692308 19.692308v39.384615z m157.538461 315.076923c0 11.815385-7.876923 19.692308-19.692307 19.692308H216.615385c-11.815385 0-19.692308-7.876923-19.692308-19.692308v-39.384615c0-11.815385 7.876923-19.692308 19.692308-19.692308h315.076923c11.815385 0 19.692308 7.876923 19.692307 19.692308v39.384615z m78.769231-157.538462c0 11.815385-7.876923 19.692308-19.692308 19.692308H216.615385c-11.815385 0-19.692308-7.876923-19.692308-19.692308v-39.384615c0-11.815385 7.876923-19.692308 19.692308-19.692308h393.846153c11.815385 0 19.692308 7.876923 19.692308 19.692308v39.384615z" p-id=3202></path></svg></i></pre></div><p>每次售后状态变更，都会记录一条日志，方便后续查询、统计。</p> <p>通过 <code>@AfterSaleLog</code> 注解，基于 Spring AOP 实现记录，具体可以看看 AfterSaleLogAspect 类。</p> <h2 id=_2-售后流程><a href=#_2-%E5%94%AE%E5%90%8E%E6%B5%81%E7%A8%8B class=header-anchor>#</a> 2. 售后流程</h2> <p>本小节，我们按照售后的 <code>申请 =&gt; 审批 =&gt; 退货 =&gt; 收货 =&gt; 退款</code> 流程，来看看售后的各个阶段。</p> <p><img src= alt=售后流程 style=cursor:zoom-in></p> <p><img src="" alt=去售后 style=cursor:zoom-in></p> <h3 id=_2-1-申请【买家】><a href=#_2-1-%E7%94%B3%E8%AF%B7%E3%80%90%E4%B9%B0%E5%AE%B6%E3%80%91 class=header-anchor>#</a> 2.1 申请【买家】</h3> <p>① 点击「申请售后」按钮，进入售后页面，对应前端 <code>yudao-mall-uniapp</code> 项目的 <code>pages/order/aftersale/apply.vue</code> 页面，如下图所示：</p> <p><img src="" alt=售后申请 style=cursor:zoom-in></p> <p>另外，可选的“申请原因”，可在 <code>trade_config</code> 表的 <code>after_sale_refund_reasons</code>、<code>after_sale_return_reasons</code> 字段配置。</p> <p>② 点击「提交」按钮，调用后端对应 AppAfterSaleController 的 <code>#createAfterSale(...)</code> 提供的“申请售后”接口，插入 <code>trade_after_sale</code> 表一条记录，状态为 <code>APPLY</code> 申请中。</p> <div class="custom-block tip"><p class=custom-block-title>售后状态：APPLY 申请中</p></div> <p>③ 发起成功后，进入售后列表页面，对应前端 <code>yudao-mall-uniapp</code> 项目的 <code>pages/order/aftersale/list.vue</code> 页面，如下图所示：</p> <p><img src= alt=售后列表 style=cursor:zoom-in></p> <p>④ 点击第一条售后记录，进入售后详情页面，对应前端 <code>yudao-mall-uniapp</code> 项目的 <code>pages/order/aftersale/detail.vue</code> 页面，如下图所示：</p> <p><img src="" alt=售后详情 style=cursor:zoom-in></p> <p>此时，买家只能等待卖家审核，或者取消售后。</p> <h3 id=_2-2-审批【卖家】><a href=#_2-2-%E5%AE%A1%E6%89%B9%E3%80%90%E5%8D%96%E5%AE%B6%E3%80%91 class=header-anchor>#</a> 2.2 审批【卖家】</h3> <p>① 卖家可以在售后列表进行审批，对应 [商城系统 -&gt; 订单中心 -&gt; 售后退款] 菜单，对应 <code>yudao-ui-admin-vue3</code> 项目的 <code>@/views/trade/afterSale</code> 目录。如下图所示：</p> <p><img src='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="1679" height="746"><rect fill-opacity="0"/></svg>' alt=售后列表 style="cursor:zoom-in;background-blend-mode:normal!important;background-clip:content-box!important;background-position:50% 50%!important;background-color:rgba(0,0,0,0)!important;background-image:var(--sf-img-13)!important;background-size:100% 100%!important;background-origin:content-box!important;background-repeat:no-repeat!important"></p> <p>② 点击第一条售后记录的「处理退款」按钮，进入售后详情页面，对应 <code>yudao-ui-admin-vue3</code> 项目的 <code>@/views/trade/afterSale/detail</code> 目录，如下图所示：</p> <p><img src='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="1679" height="746"><rect fill-opacity="0"/></svg>' alt=售后详情 style="cursor:zoom-in;background-blend-mode:normal!important;background-clip:content-box!important;background-position:50% 50%!important;background-color:rgba(0,0,0,0)!important;background-image:var(--sf-img-13)!important;background-size:100% 100%!important;background-origin:content-box!important;background-repeat:no-repeat!important"></p> <p>③ 点击「同意售后」按钮，调用后端对应 AfterSaleController 的 <code>#agreeAfterSale(...)</code> 提供的“同意售后”接口，更新 <code>trade_after_sale</code> 表的状态为 <code>SELLER_AGREE</code> 卖家通过（待买家退货）。</p> <div class="custom-block tip"><p class=custom-block-title>售后状态：SELLER_AGREE 卖家通过（待买家退货）</p></div> <h3 id=_2-3-退货【买家】><a href=#_2-3-%E9%80%80%E8%B4%A7%E3%80%90%E4%B9%B0%E5%AE%B6%E3%80%91 class=header-anchor>#</a> 2.3 退货【买家】</h3> <p>① 点击「填写退货」按钮，进入退货页面，对应前端 <code>yudao-mall-uniapp</code> 项目的 <code>pages/order/aftersale/return-delivery.vue</code> 页面，如下图所示：</p> <p><img src= alt=退货 style=cursor:zoom-in></p> <p>② 点击「提交」按钮，调用后端对应 AppAfterSaleController 的 <code>#deliveryAfterSale(...)</code> 提供的“退回货物”接口，更新 <code>trade_after_sale</code> 表的状态为 <code>BUYER_DELIVERY</code> 买家已退货（待卖家收货）。</p> <div class="custom-block tip"><p class=custom-block-title>售后状态：BUYER_DELIVERY 买家已退货（待卖家收货）</p></div> <h3 id=_2-4-收货【卖家】><a href=#_2-4-%E6%94%B6%E8%B4%A7%E3%80%90%E5%8D%96%E5%AE%B6%E3%80%91 class=header-anchor>#</a> 2.4 收货【卖家】</h3> <p>点击「确认收货」按钮，调用后端对应 AfterSaleController 的 <code>#receiveAfterSale(...)</code> 提供的“确认收货”接口，更新 <code>trade_after_sale</code> 表的状态为 <code>WAIT_REFUND</code> 卖家已收货（待卖家退款）。</p> <div class="custom-block tip"><p class=custom-block-title>售后状态：WAIT_REFUND 卖家已收货（待卖家退款）</p></div> <p><img src="" alt=收货 style=cursor:zoom-in></p> <h3 id=_2-5-退款【卖家】><a href=#_2-5-%E9%80%80%E6%AC%BE%E3%80%90%E5%8D%96%E5%AE%B6%E3%80%91 class=header-anchor>#</a> 2.5 退款【卖家】</h3> <p>① 点击「确认退款」按钮，调用后端对应 AfterSaleController 的 <code>#refundAfterSale(...)</code> 提供的“确认退款”接口，更新 <code>trade_after_sale</code> 表的状态为 <code>COMPLETE</code> 退款成功。</p> <div class="custom-block tip"><p class=custom-block-title>售后状态：COMPLETE 退款成功</p></div> <p><img src="" alt=退款 style=cursor:zoom-in></p> <p>该接口的内部实现，主要是调用支付中心的退款接口，具体可以看看 <a href=https://doc.iocoder.cn/pay/refund-demo/>《21.支付宝、微信退款接入》</a> 文档。</p> <p>② 在真正退款到卖家的支付宝、微信账户后（退款是个异步过程），支付中心会回调 AfterSaleController 的 <code>#updateAfterRefund(...)</code> 提供的“更新售后订单为已退款”接口，目前仅仅打印日志，可以按需拓展。</p> <p>至此，售后流程结束~可以试着多多 debug 调试整个流程，并不复杂噢。</p> <h2 id=_3-售后配置><a href=#_3-%E5%94%AE%E5%90%8E%E9%85%8D%E7%BD%AE class=header-anchor>#</a> 3. 售后配置</h2> <p><img src="" alt=售后配置 style=cursor:zoom-in></p> <ul><li>SQL 对应 <code>trade_config</code> 表的 <code>after_sale_</code> 开头的字段。</li> <li>前端对应 <code>yudao-ui-admin-vue3</code> 项目的 <code>views/mall/trade/config/index.vue</code> 目录</li> <li>后端对应 <code>yudao-module-trade-biz</code> 项目的 TradeConfigController 类</ul></div></div> <div class="page-slot page-slot-bottom">
 <div class="wwads-cn wwads-horizontal pageB" data-id=136 style=width:100%;max-height:80px;min-height:auto;display:flex></div>
 
 </div> <div class=page-edit> </div> <div class=page-nav-wapper><div class=page-nav-centre-wrap><a href=https://doc.iocoder.cn/mall/trade-order/ class="page-nav-centre page-nav-centre-prev"><div class="tooltip sf-hidden" style=left:351px;top:522px>【交易】交易订单</div></a> <a href=https://doc.iocoder.cn/mall/trade-delivery-express/ class="page-nav-centre page-nav-centre-next"><div class="tooltip sf-hidden">【交易】快递发货</div></a></div> <div class=page-nav><p class=inner><span class=prev>
 ←
 <a href=https://doc.iocoder.cn/mall/trade-order/ class=prev>【交易】交易订单</a></span> <span class=next><a href=https://doc.iocoder.cn/mall/trade-delivery-express/>【交易】快递发货</a>→
 </span></p></div></div></div> </main></div> <div class=footer><div class=icons><a href=mailto:7685413@qq.com title=发邮件 target=_blank class="iconfont icon-youjian"></a><a href=https://github.com/YunaiV title=GitHub target=_blank class="iconfont icon-github"></a><a href=https://www.iocoder.cn/?yudao title=博客 target=_blank class="iconfont icon-erji"></a></div> 
 Theme by
 <a href=https://github.com/xugaoyi/vuepress-theme-vdoing target=_blank title=本站主题>Vdoing</a> 
 | Copyright © 2019-2024
 <span>芋道源码 | MIT License</span></div> <div class=buttons><div title=返回顶部 class="button blur go-to-top iconfont icon-fanhuidingbu" style=display:none></div> <div title=去评论 class="button blur go-to-comment iconfont icon-pinglun" style=display:none></div> <div title=主题模式 class="button blur theme-mode-but iconfont icon-zhuti"><ul class=select-box style=display:none></ul></div></div> <div class="custom-html-window custom-html-window-rb" style=display:><div class=custom-wrapper><span class="close-but sf-hidden">×</span> <div>
 <div class="wwads-cn wwads-vertical windowRB" data-id=136 style=max-width:160px;min-width:auto;min-height:auto></div>
 <style class=sf-hidden>.windowRB{padding:0}</style>
 </div></div></div></div><div class=global-ui></div></div>
 
 
